/*
Copyright 2024.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package v1

import (
	v1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// EDIT THIS FILE!  THIS IS SCAFFOLDING FOR YOU TO OWN!
// NOTE: json tags are required.  Any new fields you add must have json tags for the fields to be serialized.

// PSJobGroupSpec defines the desired state of PSJobGroup
type PSJobGroupSpec struct {
	// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
	// Important: Run "make" to regenerate code after modifying this file

	// Image is the image of the PSJobGroup, server and worker will use the same image, different env will be set to distinguish them
	Image string `json:"image,omitempty"`

	// WorkerBandWidth is the bandwidth of the worker
	WorkerBandWidth string `json:"workerBandWidth,omitempty"`

	// EnvCfg is the env config of the PSJobGroup
	EnvCfg EnvConfig `json:"envCfg,omitempty"`

	Template PSJobGroupTemplate `json:"template,omitempty"`
}

type EnvConfig struct {
	// WorkerNum is the number of workers in the PSJobGroup
	WorkerNum int `json:"workerNum,omitempty"`

	// ServerNum is the number of servers in the PSJobGroup, only support 1 now
	ServerNum int `json:"serverNum,omitempty"`

	// WorkerDataSize is the size of the data uploaded by worker
	WorkerDataSize int `json:"workerDataSize,omitempty"`

	// BatchSize is the batch size of the data uploaded by each worker
	BatchSize int `json:"batchSize,omitempty"`
}

type PSJobGroupTemplate struct {
	SvcTemplate ServiceTemplate `json:"svcTemplate,omitempty"`
}

type ServiceTemplate struct {
	Spec v1.ServiceSpec `json:"spec,omitempty"`
}

// PSJobGroupStatus defines the observed state of PSJobGroup
type PSJobGroupStatus struct {
	// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
	// Important: Run "make" to regenerate code after modifying this file
	WorkerNodeNum int64 `json:"workerNodeNum,omitempty"`
	// +kubebuilder:validation:Enum=Pending;Completed;Error
	Status string `json:"status,omitempty"`
}

// +kubebuilder:object:root=true
// +kubebuilder:subresource:status

// PSJobGroup is the Schema for the psjobgroups API
type PSJobGroup struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   PSJobGroupSpec   `json:"spec,omitempty"`
	Status PSJobGroupStatus `json:"status,omitempty"`
}

// +kubebuilder:object:root=true

// PSJobGroupList contains a list of PSJobGroup
type PSJobGroupList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []PSJobGroup `json:"items"`
}

func init() {
	SchemeBuilder.Register(&PSJobGroup{}, &PSJobGroupList{})
}
